// $ANTLR 3.0.1 /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g 2008-01-14 19:54:36


package gramaticaANTLR;

import gramatica.Gramatica;
import gramatica.ParteDerecha;

import java.util.ArrayList;

import org.antlr.runtime.BitSet;
import org.antlr.runtime.IntStream;
import org.antlr.runtime.Parser;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;

import simbolo.NoTerminal;
import simbolo.Simbolo;
import simbolo.Terminal;

public class GramaticaParser extends Parser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "LLAVEIZQ", "LLAVEDER", "FLECHA", "FINPROD", "TERMINAL", "NOTERMINAL", "WS"
    };
    public static final int WS=10;
    public static final int LLAVEIZQ=4;
    public static final int TERMINAL=8;
    public static final int LLAVEDER=5;
    public static final int FINPROD=7;
    public static final int FLECHA=6;
    public static final int EOF=-1;
    public static final int NOTERMINAL=9;

        public GramaticaParser(TokenStream input) {
            super(input);
        }
        

    public String[] getTokenNames() { return tokenNames; }
    public String getGrammarFileName() { return "/home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g"; }



    Gramatica gramatica = new Gramatica();

    public Gramatica getGramatica() {
    	return gramatica;
    }

    /* Override exceptions... dejemos que las escupa.*/
    protected void mismatch(IntStream input, int ttype, BitSet follow)
        throws RecognitionException
    {
        //throw new MismatchedTokenException(ttype, input);
        throw new RecognitionException(input);
    }
    public void recoverFromMismatchedSet(IntStream input,
                                         RecognitionException e,
                                         BitSet follow)
        throws RecognitionException
    {
        throw e;
    }




    // $ANTLR start gramatica
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:91:1: gramatica : terminales noTerminales simboloInicial listaProducciones EOF ;
    public final void gramatica() throws RecognitionException {
        ArrayList<Terminal> terminales1 = null;

        ArrayList<NoTerminal> noTerminales2 = null;

        NoTerminal simboloInicial3 = null;


        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:92:2: ( terminales noTerminales simboloInicial listaProducciones EOF )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:92:4: terminales noTerminales simboloInicial listaProducciones EOF
            {
            pushFollow(FOLLOW_terminales_in_gramatica85);
            terminales1=terminales();
            _fsp--;


            			gramatica.setTerminales(terminales1);
            		
            pushFollow(FOLLOW_noTerminales_in_gramatica91);
            noTerminales2=noTerminales();
            _fsp--;


            			gramatica.setNoTerminales(noTerminales2);
            			gramatica.iniciarProducciones();
            		
            pushFollow(FOLLOW_simboloInicial_in_gramatica97);
            simboloInicial3=simboloInicial();
            _fsp--;


            			gramatica.setSimboloInicial(simboloInicial3);
            		
            pushFollow(FOLLOW_listaProducciones_in_gramatica103);
            listaProducciones();
            _fsp--;

            match(input,EOF,FOLLOW_EOF_in_gramatica105); 

            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return ;
    }
    // $ANTLR end gramatica


    // $ANTLR start terminales
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:105:1: terminales returns [ArrayList<Terminal> terminales] : LLAVEIZQ listaTerminales LLAVEDER ;
    public final ArrayList<Terminal> terminales() throws RecognitionException {
        ArrayList<Terminal> terminales = null;

        ArrayList<Terminal> listaTerminales4 = null;


        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:106:2: ( LLAVEIZQ listaTerminales LLAVEDER )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:106:4: LLAVEIZQ listaTerminales LLAVEDER
            {
            match(input,LLAVEIZQ,FOLLOW_LLAVEIZQ_in_terminales119); 
            pushFollow(FOLLOW_listaTerminales_in_terminales123);
            listaTerminales4=listaTerminales();
            _fsp--;

            terminales = listaTerminales4;
            match(input,LLAVEDER,FOLLOW_LLAVEDER_in_terminales129); 

            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return terminales;
    }
    // $ANTLR end terminales


    // $ANTLR start listaTerminales
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:111:1: listaTerminales returns [ArrayList<Terminal> terminales] : ( TERMINAL )* ;
    public final ArrayList<Terminal> listaTerminales() throws RecognitionException {
        ArrayList<Terminal> terminales = null;

        Token TERMINAL5=null;


        terminales = new ArrayList<Terminal>();

        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:115:2: ( ( TERMINAL )* )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:115:4: ( TERMINAL )*
            {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:115:4: ( TERMINAL )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==TERMINAL) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:115:5: TERMINAL
            	    {
            	    TERMINAL5=(Token)input.LT(1);
            	    match(input,TERMINAL,FOLLOW_TERMINAL_in_listaTerminales149); 

            	    			terminales.add(new Terminal(TERMINAL5.getText()));
            	    		

            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);


            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return terminales;
    }
    // $ANTLR end listaTerminales


    // $ANTLR start noTerminales
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:120:1: noTerminales returns [ArrayList<NoTerminal> noTerminales] : LLAVEIZQ listaNoTerminales LLAVEDER ;
    public final ArrayList<NoTerminal> noTerminales() throws RecognitionException {
        ArrayList<NoTerminal> noTerminales = null;

        ArrayList<NoTerminal> listaNoTerminales6 = null;


        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:121:2: ( LLAVEIZQ listaNoTerminales LLAVEDER )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:121:4: LLAVEIZQ listaNoTerminales LLAVEDER
            {
            match(input,LLAVEIZQ,FOLLOW_LLAVEIZQ_in_noTerminales168); 
            pushFollow(FOLLOW_listaNoTerminales_in_noTerminales172);
            listaNoTerminales6=listaNoTerminales();
            _fsp--;

            noTerminales = listaNoTerminales6;
            match(input,LLAVEDER,FOLLOW_LLAVEDER_in_noTerminales178); 

            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return noTerminales;
    }
    // $ANTLR end noTerminales


    // $ANTLR start listaNoTerminales
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:126:1: listaNoTerminales returns [ArrayList<NoTerminal> noTerminales] : ( NOTERMINAL )* ;
    public final ArrayList<NoTerminal> listaNoTerminales() throws RecognitionException {
        ArrayList<NoTerminal> noTerminales = null;

        Token NOTERMINAL7=null;


        	noTerminales = new ArrayList<NoTerminal>();

        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:130:2: ( ( NOTERMINAL )* )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:130:4: ( NOTERMINAL )*
            {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:130:4: ( NOTERMINAL )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==NOTERMINAL) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:130:5: NOTERMINAL
            	    {
            	    NOTERMINAL7=(Token)input.LT(1);
            	    match(input,NOTERMINAL,FOLLOW_NOTERMINAL_in_listaNoTerminales198); 
            	    noTerminales.add(new NoTerminal(NOTERMINAL7.getText()));

            	    }
            	    break;

            	default :
            	    break loop2;
                }
            } while (true);


            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return noTerminales;
    }
    // $ANTLR end listaNoTerminales


    // $ANTLR start simboloInicial
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:133:1: simboloInicial returns [NoTerminal simboloInicial] : NOTERMINAL ;
    public final NoTerminal simboloInicial() throws RecognitionException {
        NoTerminal simboloInicial = null;

        Token NOTERMINAL8=null;

        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:134:2: ( NOTERMINAL )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:134:4: NOTERMINAL
            {
            NOTERMINAL8=(Token)input.LT(1);
            match(input,NOTERMINAL,FOLLOW_NOTERMINAL_in_simboloInicial216); 

            				NoTerminal nt = new NoTerminal(NOTERMINAL8.getText());
            				if (gramatica.getNoTerminales().indexOf(nt) != -1) {
            					simboloInicial = nt;
            				}
            				else {
            					System.err.println("Símbolo inicial no válido: " + 
            							NOTERMINAL8.getText() + " no está en los no terminales");
            					throw new RecognitionException();
            				}
            			

            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return simboloInicial;
    }
    // $ANTLR end simboloInicial


    // $ANTLR start listaProducciones
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:147:1: listaProducciones : ( produccion )* ;
    public final void listaProducciones() throws RecognitionException {
        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:148:2: ( ( produccion )* )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:148:4: ( produccion )*
            {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:148:4: ( produccion )*
            loop3:
            do {
                int alt3=2;
                int LA3_0 = input.LA(1);

                if ( (LA3_0==NOTERMINAL) ) {
                    alt3=1;
                }


                switch (alt3) {
            	case 1 :
            	    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:148:4: produccion
            	    {
            	    pushFollow(FOLLOW_produccion_in_listaProducciones228);
            	    produccion();
            	    _fsp--;


            	    }
            	    break;

            	default :
            	    break loop3;
                }
            } while (true);


            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return ;
    }
    // $ANTLR end listaProducciones


    // $ANTLR start produccion
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:151:1: produccion : NOTERMINAL FLECHA parteDerecha FINPROD ;
    public final void produccion() throws RecognitionException {
        Token NOTERMINAL9=null;
        ParteDerecha parteDerecha10 = null;


        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:152:2: ( NOTERMINAL FLECHA parteDerecha FINPROD )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:152:4: NOTERMINAL FLECHA parteDerecha FINPROD
            {
            NOTERMINAL9=(Token)input.LT(1);
            match(input,NOTERMINAL,FOLLOW_NOTERMINAL_in_produccion239); 

            				NoTerminal nt = new NoTerminal(NOTERMINAL9.getText());
            				if (gramatica.getNoTerminales().indexOf(nt) == -1) {
            					System.err.println("Parte derecha inválida: " + 
            							NOTERMINAL9.getText() + " no está en los no terminales");
            					throw new RecognitionException();
            				}
            			
            match(input,FLECHA,FOLLOW_FLECHA_in_produccion245); 
            pushFollow(FOLLOW_parteDerecha_in_produccion249);
            parteDerecha10=parteDerecha();
            _fsp--;


            			gramatica.definirProduccion(new NoTerminal(NOTERMINAL9.getText()),
            				parteDerecha10);
            		
            match(input,FINPROD,FOLLOW_FINPROD_in_produccion255); 

            }

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return ;
    }
    // $ANTLR end produccion


    // $ANTLR start parteDerecha
    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:168:1: parteDerecha returns [ParteDerecha parteDerecha] : ( NOTERMINAL | TERMINAL )* ;
    public final ParteDerecha parteDerecha() throws RecognitionException {
        ParteDerecha parteDerecha = null;

        Token NOTERMINAL11=null;
        Token TERMINAL12=null;


        	ArrayList<Simbolo> simbolos = new ArrayList<Simbolo>();
        	parteDerecha = new ParteDerecha();

        try {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:176:2: ( ( NOTERMINAL | TERMINAL )* )
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:176:4: ( NOTERMINAL | TERMINAL )*
            {
            // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:176:4: ( NOTERMINAL | TERMINAL )*
            loop4:
            do {
                int alt4=3;
                int LA4_0 = input.LA(1);

                if ( (LA4_0==NOTERMINAL) ) {
                    alt4=1;
                }
                else if ( (LA4_0==TERMINAL) ) {
                    alt4=2;
                }


                switch (alt4) {
            	case 1 :
            	    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:176:5: NOTERMINAL
            	    {
            	    NOTERMINAL11=(Token)input.LT(1);
            	    match(input,NOTERMINAL,FOLLOW_NOTERMINAL_in_parteDerecha280); 

            	    				NoTerminal nt = new NoTerminal(NOTERMINAL11.getText());
            	    				if (gramatica.getNoTerminales().indexOf(nt) != -1) {
            	    					simbolos.add(nt);
            	    				}
            	    				else {
            	    					System.err.println("Símbolo no terminal no válido en parte derecha de producción: " + 
            	    							NOTERMINAL11.getText() + " no está en los no terminales");
            	    					throw new RecognitionException();
            	    				}
            	    			

            	    }
            	    break;
            	case 2 :
            	    // /home/tinia/tl/repositorio/tptl/GeneradorTabla/gramaticaANTLR/Gramatica.g:187:3: TERMINAL
            	    {
            	    TERMINAL12=(Token)input.LT(1);
            	    match(input,TERMINAL,FOLLOW_TERMINAL_in_parteDerecha288); 

            	    				Terminal t = new Terminal(TERMINAL12.getText());
            	    				if (gramatica.getTerminales().indexOf(t) != -1) {
            	    					simbolos.add(t);
            	    				}
            	    				else {
            	    					System.err.println("Símbolo terminal no válido en parte derecha de producción: " + 
            	    							TERMINAL12.getText() + " no está en los no terminales");
            	    					throw new RecognitionException();
            	    				}
            	    			

            	    }
            	    break;

            	default :
            	    break loop4;
                }
            } while (true);


            }


            	parteDerecha.setSimbolos(simbolos);

        }

        /* Manejo de excepciones */
        catch (RecognitionException e) {
            throw e;
        }
        finally {
        }
        return parteDerecha;
    }
    // $ANTLR end parteDerecha


 

    public static final BitSet FOLLOW_terminales_in_gramatica85 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_noTerminales_in_gramatica91 = new BitSet(new long[]{0x0000000000000200L});
    public static final BitSet FOLLOW_simboloInicial_in_gramatica97 = new BitSet(new long[]{0x0000000000000200L});
    public static final BitSet FOLLOW_listaProducciones_in_gramatica103 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_gramatica105 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LLAVEIZQ_in_terminales119 = new BitSet(new long[]{0x0000000000000120L});
    public static final BitSet FOLLOW_listaTerminales_in_terminales123 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_LLAVEDER_in_terminales129 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_TERMINAL_in_listaTerminales149 = new BitSet(new long[]{0x0000000000000102L});
    public static final BitSet FOLLOW_LLAVEIZQ_in_noTerminales168 = new BitSet(new long[]{0x0000000000000220L});
    public static final BitSet FOLLOW_listaNoTerminales_in_noTerminales172 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_LLAVEDER_in_noTerminales178 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_NOTERMINAL_in_listaNoTerminales198 = new BitSet(new long[]{0x0000000000000202L});
    public static final BitSet FOLLOW_NOTERMINAL_in_simboloInicial216 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_produccion_in_listaProducciones228 = new BitSet(new long[]{0x0000000000000202L});
    public static final BitSet FOLLOW_NOTERMINAL_in_produccion239 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_FLECHA_in_produccion245 = new BitSet(new long[]{0x0000000000000380L});
    public static final BitSet FOLLOW_parteDerecha_in_produccion249 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_FINPROD_in_produccion255 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_NOTERMINAL_in_parteDerecha280 = new BitSet(new long[]{0x0000000000000302L});
    public static final BitSet FOLLOW_TERMINAL_in_parteDerecha288 = new BitSet(new long[]{0x0000000000000302L});

}